home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 8 / FM Towns Free Software Collection 8.iso / t_os / clcl / aoi_lib2.c next >
Text File  |  1994-06-01  |  42KB  |  1,520 lines

  1. /*
  2. ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
  3. ┃ 葵ライブラリ                         /////  Tab Size : 4  /////  ┃
  4. ┃                                      /////  Margin : 120  /////  ┃
  5. ┃ aoi_lib2.c   v1.0 L21                                            ┃
  6. ┃                                                                  ┃
  7. ┃ (C)K.Konishi 10-Feb-94                                           ┃
  8. ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
  9. */
  10.  
  11. #define    LIB
  12.  
  13. #include <stdio.h>
  14. #include <string.h>
  15. #include <stdlib.h>
  16. #include <io.h>
  17. #include <time.h>
  18. #include <conio.h>
  19. #include <msdos.cf>
  20. #include <EGB.h>
  21. #include <MOS.h>
  22. #include <SND.h>
  23. #include "Platform.h"
  24. #include "aoi_lib2.h"
  25.  
  26.  
  27. // #define    TEST 
  28. // 上の行の//を取るとサンプルプログラムが出来上がります。
  29.  
  30.  
  31. #define    MDCL1     1    /* 色の名前 */
  32. #define    MDCL2     2
  33. #define    MDCL3     3
  34. #define    MDCL4     4
  35. #define    MDCL5     5
  36. #define    MDCL6     9    /* 6から9に変えています */
  37. #define    MDCL7     7
  38.  
  39. #define    BLACK     8
  40. #define    BLUE     9
  41. #define    RED        10
  42. #define    PURPLE    11
  43. #define    GREEN    12
  44. #define    SKYBLUE    13
  45. #define    YELLOW    14
  46. #define    WHITE    15
  47.  
  48. int AOIpset(short x, short y, short c)
  49. {
  50.     EGB_color(work, 0, c);
  51.     WORD(para + 0) = 1;
  52.     WORD(para + 2) = x;
  53.     WORD(para + 4) = y;
  54.     return EGB_pset(work, para);
  55. }
  56.  
  57. int AOIcircle(short x, short y, short r, short c)
  58. {
  59.     EGB_color(work, 0, c);
  60.     WORD(para + 0) = x;
  61.     WORD(para + 2) = y;
  62.     WORD(para + 4) = r;
  63.     return EGB_circle(work, para);
  64. }
  65.  
  66. int AOIstring(short x, short y, AOIstringData *Data, char *tx)
  67. {
  68.     AOIstringData Dt = *Data;
  69.     EGB_color(work, 0, Dt.sc);
  70.     EGB_fontStyle(work, Dt.ss);
  71.     EGB_textZoom(work, 1, Dt.sx, Dt.sy);
  72.     EGB_textZoom(work, 0, Dt.ax, Dt.ay);
  73.     WORD(para + 0) = x;
  74.     WORD(para + 2) = y;
  75.     WORD(para + 4) = strlen(tx);
  76.     strcpy((para + 6), tx);
  77.     return EGB_sjisString(work, para);
  78. }
  79.  
  80. int AOIstrSetup(short zsx, short zsy, short zax, short zay, short sf, short sc)
  81. {
  82.     return    EGB_textZoom(work, 1, zsx, zsy)
  83.         |    EGB_textZoom(work, 0, zax, zay)
  84.         |    EGB_fontStyle(work, sf)
  85.         |    EGB_color(work, 0, sc);
  86. }
  87.  
  88. int AOIstrSjis(short x, short y, char *tx)
  89. {
  90.     WORD(para + 0) = x;
  91.     WORD(para + 2) = y;
  92.     WORD(para + 4) = strlen(tx);
  93.     strcpy((para + 6), tx);
  94.     return EGB_sjisString(work, para);
  95. }
  96.  
  97. int AOIanyChar(short x, short y, short fx, short fy, char *data)
  98. {
  99.     WORD(para + 0) = x;
  100.     WORD(para + 2) = y;
  101.     WORD(para + 4) = 0;
  102.     EGB_sjisString(work, para);    /* 座標設定用ダミー */
  103.     return EGB_anyChar(work, fx, fy, data);
  104. }
  105.  
  106. int AOIline(short x0, short y0, short x1, short y1, short c)
  107. {
  108.     EGB_color(work, 0, c);
  109.     WORD(para + 0) = 2;
  110.     WORD(para + 2) = x0;
  111.     WORD(para + 4) = y0;
  112.     WORD(para + 6) = x1;
  113.     WORD(para + 8) = y1;
  114.     return EGB_connect(work, para);
  115. }
  116.  
  117. int AOIconnectLeft(short x0, short y0, short x1, short y1, short c)
  118. {
  119.     EGB_color(work, 0, c);
  120.     WORD(para +  0) = 3;
  121.     WORD(para +  2) = x0;
  122.     WORD(para +  4) = y1;
  123.     WORD(para +  6) = x0;
  124.     WORD(para +  8) = y0;
  125.     WORD(para + 10) = x1;
  126.     WORD(para + 12) = y0;
  127.     return EGB_connect(work, para);
  128. }
  129.  
  130. int AOIconnectRight(short x0, short y0, short x1, short y1, short c)
  131. {
  132.     EGB_color(work, 0, c);
  133.     WORD(para +  0) = 3;
  134.     WORD(para +  2) = x0;
  135.     WORD(para +  4) = y1;
  136.     WORD(para +  6) = x1;
  137.     WORD(para +  8) = y1;
  138.     WORD(para + 10) = x1;
  139.     WORD(para + 12) = y0;
  140.     return EGB_connect(work, para);
  141. }
  142.  
  143. int AOIconnectLeftIGRB(short x0, short y0, short x1, short y1, int c)
  144. {
  145.     EGB_colorIGRB(work, 0, c);
  146.     WORD(para +  0) = 3;
  147.     WORD(para +  2) = x0;
  148.     WORD(para +  4) = y1;
  149.     WORD(para +  6) = x0;
  150.     WORD(para +  8) = y0;
  151.     WORD(para + 10) = x1;
  152.     WORD(para + 12) = y0;
  153.     return EGB_connect(work, para);
  154. }
  155.  
  156. int AOIconnectRightIGRB(short x0, short y0, short x1, short y1, int c)
  157. {
  158.     EGB_colorIGRB(work, 0, c);
  159.     WORD(para +  0) = 3;
  160.     WORD(para +  2) = x0;
  161.     WORD(para +  4) = y1;
  162.     WORD(para +  6) = x1;
  163.     WORD(para +  8) = y1;
  164.     WORD(para + 10) = x1;
  165.     WORD(para + 12) = y0;
  166.     return EGB_connect(work, para);
  167. }
  168.  
  169. int AOIbox(short x0, short y0, short x1, short y1, short c)
  170. {
  171.     EGB_color(work, 0, c);
  172.     WORD(para +  0) = x0;
  173.     WORD(para +  2) = y0;
  174.     WORD(para +  4) = x1;
  175.     WORD(para +  6) = y1;
  176.     return EGB_rectangle(work, para);
  177. }
  178.  
  179. int AOIboxFull(short x0, short y0, short x1, short y1, int c)
  180. {
  181.     int ret = 0;
  182.  
  183.     if (y0 > y1) {
  184.         y1 ^= y0;    y0 ^= y1;    y1 ^= y0;
  185.         x1 ^= x0;    x0 ^= x1;    x1 ^= x0;
  186.     }
  187.     ret = EGB_color(work, 0, c);
  188.     WORD(para + 0) = 2;
  189.     WORD(para + 2) = x0;
  190.     WORD(para + 6) = x1;
  191.     for (; y0 <= y1; y0++) {
  192.         WORD(para + 4) = y0;
  193.         WORD(para + 8) = y0;
  194.         ret += EGB_connect(work, para);
  195.     }
  196.     return ret;
  197. }
  198.  
  199. int AOIboxFullIGRB(short x0, short y0, short x1, short y1, int c)
  200. {
  201.     int ret = 0;
  202.  
  203.     if (y0 > y1) {
  204.         y1 ^= y0;    y0 ^= y1;    y1 ^= y0;
  205.         x1 ^= x0;    x0 ^= x1;    x1 ^= x0;
  206.     }
  207.     ret = EGB_colorIGRB(work, 0, c);
  208.     WORD(para + 0) = 2;
  209.     WORD(para + 2) = x0;
  210.     WORD(para + 6) = x1;
  211.     for (; y0 <= y1; y0++) {
  212.         WORD(para + 4) = y0;
  213.         WORD(para + 8) = y0;
  214.         ret += EGB_connect(work, para);
  215.     }
  216.     return ret;
  217. }
  218.  
  219. int AOIwinBase(short x, short y, short lx, short ly, short sd)
  220. {
  221.     int i = 0;
  222.     
  223.     if (sd == 1) {
  224.         EGB_writeMode(work, 7);
  225.         EGB_pastel(work, 128);
  226.         i = AOIboxFull(x + lx + 1, y + 6, x + lx + 6, y + ly + 7, MDCL1)
  227.         |    AOIboxFull(x + 6, y + ly + 1, x + lx, y + ly + 7, MDCL1);
  228.         EGB_writeMode(work, 0);
  229.     }
  230.     return    i
  231.         |    AOIboxFull(x, y, x + lx, y + ly, MDCL6)
  232.         |    AOIconnectLeft (x    , y    , x + lx - 1, y + ly - 1, WHITE)
  233.         |    AOIconnectRight(x    , y    , x + lx    , y + ly    , MDCL1)
  234.         |    AOIconnectLeft (x + 4, y + 4, x + lx - 5, y + ly - 5, MDCL1)
  235.         |    AOIconnectRight(x + 4, y + 4, x + lx - 4, y + ly - 4, WHITE);
  236. }
  237.  
  238. int AOIwinBase2(int x, int y, int lx, int ly, int sd)
  239. {
  240.     int i = 0;
  241.     
  242.     if (sd != 0) {
  243.         EGB_writeMode(work, 7);
  244.         EGB_pastel(work, 128);
  245.         i = AOIboxFull(x + lx + 1, y + sd - 1, x + lx + sd - 1, y + ly + sd, MDCL1)
  246.         |    AOIboxFull(x + sd - 1, y + ly + 1, x + lx, y + ly + sd, MDCL1);
  247.         EGB_writeMode(work, 0);
  248.     }
  249.     return    i
  250.         |    AOIboxFull(x, y, x + lx, y + ly, MDCL6)
  251.         |    AOIconnectLeft (x    , y    , x + lx - 1, y + ly - 1, WHITE)
  252.         |    AOIconnectRight(x    , y    , x + lx    , y + ly    , MDCL1)
  253.         |    AOIconnectLeft (x + 4, y + 4, x + lx - 5, y + ly - 5, MDCL1)
  254.         |    AOIconnectRight(x + 4, y + 4, x + lx - 4, y + ly - 4, WHITE);
  255. }
  256.  
  257. int AOIbuttonBase(short x, short y, short lx, short ly)
  258. {
  259.     return    AOIboxFull(x + 1, y + 1, x + lx - 1, y + ly - 1, MDCL6)
  260.         |    AOIconnectLeft (x, y, x + lx - 1, y + ly - 1, WHITE)
  261.         |    AOIconnectRight(x, y, x + lx    , y + ly    , MDCL1);
  262. }
  263.  
  264. int AOIbuttonBase2(int x, int y, int lx, int ly)
  265. {
  266.     return    AOIboxFull(x + 1, y + 1, x + lx - 1, y + ly - 1, MDCL6)
  267.         |    AOIconnectLeft (x, y, x + lx - 1, y + ly - 1, WHITE)
  268.         |    AOIconnectRight(x, y, x + lx    , y + ly    , MDCL1);
  269. }
  270.  
  271. int AOIwinBase32k(int x, int y, int lx, int ly, int sd)
  272. {
  273.     //    sd : 影の大きさ
  274.     int i = 0;
  275.     
  276.     if (sd != 0) {
  277.         EGB_writeMode(work, 7);
  278.         EGB_pastel(work, 128);
  279.         i = AOIboxFullIGRB(x + lx + 1, y + sd - 1, x + lx + sd - 1, y + ly + sd, 0)
  280.         |    AOIboxFullIGRB(x + sd - 1, y + ly + 1, x + lx, y + ly + sd, 0);
  281.         EGB_writeMode(work, 0);
  282.     }
  283.     return    i
  284.         |    AOIboxFullIGRB(x, y, x + lx, y + ly, LIGHTBULE32K)
  285.         |    AOIconnectLeftIGRB (x    , y    , x + lx - 1, y + ly - 1, WHITE32K)
  286.         |    AOIconnectRightIGRB(x    , y    , x + lx    , y + ly    , DARKBULE32K)
  287.         |    AOIconnectLeftIGRB (x + 4, y + 4, x + lx - 5, y + ly - 5, DARKBULE32K)
  288.         |    AOIconnectRightIGRB(x + 4, y + 4, x + lx - 4, y + ly - 4, WHITE32K);
  289. }
  290.  
  291. int AOIbuttonBase32k(int x, int y, int lx, int ly)
  292. {
  293.     return    AOIboxFullIGRB(x + 1, y + 1, x + lx - 1, y + ly - 1, LIGHTBULE32K)
  294.         |    AOIconnectLeftIGRB (x, y, x + lx - 1, y + ly - 1, WHITE32K)
  295.         |    AOIconnectRightIGRB(x, y, x + lx    , y + ly    , DARKBULE32K);
  296. }
  297.  
  298. int AOIsetPalette(int cn, int cg, int cr, int cb)
  299. {
  300.     DWORD(para + 0) = 1;
  301.     DWORD(para + 4) = cn;                 /* cn 色識別番号 */
  302.     BYTE(para +  8) = cb * 17;            /* cb  青 */
  303.     BYTE(para +  9) = cr * 17;            /* cr  赤 */
  304.     BYTE(para + 10) = cg * 17;          /* cg  緑 */
  305.     BYTE(para + 11) = 0;
  306.     return EGB_palette(work, 0, para);    /* display レイヤ表示 */
  307. }
  308.  
  309. int AOIsetPalette256(int cn, int cg, int cr, int cb)
  310. {
  311.     DWORD(para + 0) = 1;
  312.     DWORD(para + 4) = cn;                 /* cn 色識別番号 */
  313.     BYTE(para +  8) = cb * 257;            /* cb  青 */
  314.     BYTE(para +  9) = cr * 257;            /* cr  赤 */
  315.     BYTE(para + 10) = cg * 257;          /* cg  緑 */
  316.     BYTE(para + 11) = 0;
  317.     return EGB_palette(work, 0, para);    /* display レイヤ表示 */
  318. }
  319.  
  320. int AOIcolorIGRB(int g, int r, int b)
  321. {
  322.     return EGB_colorIGRB(work, 0, (((g << 19) & 0xff0000) + ((r << 11) & 0xff00) + ((b << 3) & 0xff)) & 0xffffff);
  323. }
  324.  
  325. int AOIsetStandardPalette(void)
  326. {
  327.     return    AOIsetPalette( 8,  0,  0,  0)
  328.         |    AOIsetPalette( 9,  0,  0, 15)
  329.         |    AOIsetPalette(10,  0, 15,  0)
  330.         |    AOIsetPalette(11,  0, 15, 15)
  331.         |    AOIsetPalette(12, 15,  0,  0)
  332.         |    AOIsetPalette(13, 15,  0, 15)
  333.         |    AOIsetPalette(14, 15, 15,  0)
  334.         |    AOIsetPalette(15, 15, 15, 15);
  335. }
  336.  
  337. short AOIbin2short(char *bin)
  338. {
  339.     short    len;
  340.     short    i;
  341.     short    ret = 0;
  342.     
  343.     len = strlen(bin);
  344.     for (i = 0; i < len; i++) {
  345.         ret <<= 1;
  346.         if (bin[i] == '1') ret++;
  347.         else if (bin[i] != '0') return 0;
  348.     }
  349.     
  350.     return ret;    
  351. }
  352.  
  353. long AOIbin2long(char *bin)
  354. {
  355.     short    len;
  356.     short    i;
  357.     long    ret = 0;
  358.     
  359.     len = strlen(bin);
  360.     for (i = 0; i < len; i++) {
  361.         ret <<= 1;
  362.         if (bin[i] == '1') ret++;
  363.         else if (bin[i] != '0') return 0;
  364.     }
  365.     
  366.     return ret;    
  367. }
  368.  
  369. void AOIsetButton(AOIbuttonData *Data, short x, short y, short lx, short ly)
  370. {
  371.     AOIbuttonData bData;
  372.  
  373.     bData.x  = x;
  374.     bData.y  = y;
  375.     bData.lx = lx;
  376.     bData.ly = ly;
  377.     *Data = bData;
  378. }
  379.  
  380. int AOIbutton(short sx, short sy, int mx, int my, AOIbuttonData *Data)
  381. {
  382.     AOIbuttonData *Dt = Data;
  383.     int i;
  384.     
  385.     for (i = 0; i <= BUTTON; i++) {
  386.         if (sx + Dt[i].x < mx && mx < sx + Dt[i].x + Dt[i].lx && sy + Dt[i].y < my && my < sy + Dt[i].y + Dt[i].ly) {
  387.             return i;
  388.         }
  389.     }
  390.     return -1;
  391. }
  392.  
  393. void _AOIfigureDrawSet(short *fig, short *a)
  394. {
  395.     short *da = a;
  396.     
  397.     switch (*fig) {
  398.         case 0 :
  399.             da[1] = da[2] = da[3] = da[4] = da[5] = da[7] = 1;
  400.             break;
  401.         case 1 :
  402.             da[4] = da[5] = 1;
  403.             break;
  404.         case 2 :
  405.             da[1] = da[4] = da[6] = da[3] = da[7] = 1;
  406.             break;
  407.         case 3 :
  408.             da[1] = da[4] = da[6] = da[5] = da[7] = 1;
  409.             break;
  410.         case 4 :
  411.             da[2] = da[6] = da[4] = da[5] = 1;
  412.             break;
  413.         case 5 :
  414.             da[1] = da[2] = da[6] = da[5] = da[7] = 1;
  415.             break;
  416.         case 6 :
  417.             da[1] = da[2] = da[3] = da[6] = da[5] = da[7] = 1;
  418.             break;
  419.         case 7 :
  420.             da[1] = da[2] = da[4] = da[5] = 1;
  421.             break;
  422.         case 8 :
  423.             da[1] = da[2] = da[3] = da[4] = da[5] = da[6] = da[7] = 1;
  424.             break;
  425.         case 9 :
  426.             da[1] = da[2] = da[4] = da[5] = da[6] = da[7] = 1;
  427.             break;
  428.     }
  429. }
  430.  
  431. void AOIfigureDraw(short sx, short sy, short figure)        /* 2桁の数字を12ドットで表示します */
  432. {
  433.     short    a[8];
  434.     short    fig[3];        /* fig[1] : 10の位        fig[2] : 1の位 */
  435.     short    i, j;
  436.     
  437.     for (i = 0; i <= 7; i++) a[i] = 0;
  438.     for (i = 0; i <= 2; i++) fig[i] = 0;
  439.  
  440.     if (figure < 0) figure = 0;    /* 負の数は0にする */
  441.  
  442.     fig[1] = figure / 10;
  443.     fig[2]  = figure - fig[1] * 10;
  444.     for (i = 1; i != 3; i++) {
  445.         _AOIfigureDrawSet(&fig[i], a);
  446.         
  447.         if (i == 2) sx += 10;
  448.         
  449.         AOIline(sx + 1, sy     , sx + 5, sy     , a[1] == 1 ? 15 : 8);
  450.         AOIline(sx    , sy     , sx    , sy +  5, a[2] == 1 ? 15 : 8);
  451.         AOIline(sx    , sy +  7, sx    , sy + 12, a[3] == 1 ? 15 : 8);
  452.         AOIline(sx + 6, sy     , sx + 6, sy +  5, a[4] == 1 ? 15 : 8);
  453.         AOIline(sx + 6, sy +  7, sx + 6, sy + 12, a[5] == 1 ? 15 : 8);
  454.         AOIline(sx + 1, sy +  6, sx + 5, sy +  6, a[6] == 1 ? 15 : 8);
  455.         AOIline(sx + 1, sy + 12, sx + 5, sy + 12, a[7] == 1 ? 15 : 8);
  456.         for (j = 0; j <= 7; j++) a[j] = 0;
  457.     }
  458. }
  459.  
  460. void AOIfigureDraw2(short sx, short sy, int figure)    /* 2桁の数字を25ドットで表示します */
  461. {
  462.     short    a[8];
  463.     short    fig[3];        /* fig[1] : 10の位        fig[2] : 1の位 */
  464.     short    i, j, k;
  465.     short    m = 0, n;
  466.     
  467.     for (i = 0; i <= 7; i++) a[i] = 0;
  468.     for (i = 0; i <= 2; i++) fig[i] = 0;
  469.  
  470.     if (figure < 0) figure = 0;    /* 負の数は0にする */
  471.  
  472.     fig[1] = figure / 10;
  473.     fig[2] = figure - fig[1] * 10;
  474.     for (i = 1; i != 3; i++) {
  475.         _AOIfigureDrawSet(&fig[i], a);
  476.         
  477.         if (i == 2) sx += 20;
  478.         for (k = 0; k < 4; k++) {
  479.             sx += k;
  480.             if (k == 0 || k == 3) m = 1;
  481.             else m = 0;
  482.             for (n = 0; n < 2; n++) {
  483.                 AOIline(sx + n * 11, sy +  3 + m, sx + n * 11, sy + 11 - m,    a[2 + n * 2] == 1 ? 14 : 8);
  484.                 AOIline(sx + n * 11, sy + 14 + m, sx + n * 11, sy + 22 - m,    a[3 + n * 2] == 1 ? 14 : 8);
  485.             }
  486.             sx -= k;
  487.         }
  488.         for (k = 0; k < 4; k++) {
  489.             sy += k;
  490.             if (k == 0 || k == 3) m = 1;
  491.             else m = 0;
  492.             AOIline(sx + 3 + m, sy     , sx + 11 - m, sy     , a[1] == 1 ? 14 : 8);
  493.             AOIline(sx + 3 + m, sy + 11, sx + 11 - m, sy + 11, a[6] == 1 ? 14 : 8);
  494.             AOIline(sx + 3 + m, sy + 22, sx + 11 - m, sy + 22, a[7] == 1 ? 14 : 8);
  495.             sy -= k;
  496.         }
  497.         for (j = 0; j <= 7; j++) a[j] = 0;
  498.     }
  499. }
  500.  
  501. short _AOIrandom(short max)    /* 0~99までの特殊用途乱数発生 */
  502. {    
  503.     short    max10, max1;
  504.     short    ret10, ret1;
  505.     
  506.     max10 = max / 10;
  507.     do {
  508.         ret10 = (rand() % 10);
  509.     } while (max10 < ret10);
  510.     ret1 = (rand() % 10);
  511.     if (max10 == ret10) {
  512.         max1 = max - max10 * 10;
  513.         while (max1 < ret1) {
  514.             ret1 = (rand() % 10);
  515.         }
  516.     }
  517.     return ret10 * 10 + ret1;
  518. }
  519.  
  520. long AOIrandom(long max)    /* 0~999999までの乱数発生 */
  521. {
  522.     time_t *t = 0;
  523.     
  524.     srand((unsigned int)time(t));
  525.     if (max > 9999) {
  526.         return _AOIrandom(max / 10000) * 10000
  527.              + _AOIrandom(99) * 100
  528.              + _AOIrandom(99);
  529.     }
  530.     if (max > 99) {
  531.         return _AOIrandom(max / 100) * 100
  532.              + _AOIrandom(99);
  533.     }
  534.     return _AOIrandom(99);
  535. }
  536.  
  537. int AOIbuttonLamp(short sx, short sy, AOIbuttonData *Data)    /* ボタン部分を反転 */
  538. {
  539.     AOIbuttonData Dt = *Data;
  540.     
  541.     return    EGB_writeMode(work, 4)
  542.         |    MOS_disp(0)
  543.         |    AOIboxFull(sx + Dt.x, sy + Dt.y, sx + Dt.x + Dt.lx, sy + Dt.y + Dt.ly, 15)
  544.         |    MOS_disp(1)
  545.         |    EGB_writeMode(work, 0);
  546. }
  547.  
  548. int AOIslantingBox(short x0, short y0, short x1, short y1, short lx, short cl)
  549. {
  550.     if (x0 == x1) return AOIbox(x0, y0, x0 + lx, y1, cl);
  551.     if (y0 == y1) return AOIline(x0, y0, x1 + lx, y0, cl);
  552.  
  553.     if (y0 > y1) {
  554.         y1 ^= y0;    y0 ^= y1;    y1 ^= y0;
  555.         x1 ^= x0;    x0 ^= x1;    x1 ^= x0;
  556.     }
  557.     
  558.     EGB_color(work, 0, cl);
  559.     WORD(para +  0) = 5;
  560.     WORD(para +  2) = x0;
  561.     WORD(para +  4) = y0;
  562.     WORD(para +  6) = x1;
  563.     WORD(para +  8) = y1;
  564.     WORD(para + 10) = x1 + lx;
  565.     WORD(para + 12) = y1;
  566.     WORD(para + 14) = x0 + lx;
  567.     WORD(para + 16) = y0;
  568.     WORD(para + 18) = x0;
  569.     WORD(para + 20) = y0;
  570.     return EGB_connect(work, para);
  571.     
  572. }
  573.  
  574. int AOIslantingBoxFull(short x0, short y0, short x1, short y1, short lx, short cl)
  575. {
  576.     short dmmy_x0;
  577.     
  578.     if (x0 == x1) return AOIbox(x0, y0, x0 + lx, y1, cl);
  579.     if (y0 == y1) return AOIline(x0, y0, x1 + lx, y0, cl);
  580.  
  581.     if (y0 > y1) {
  582.         y1 ^= y0;    y0 ^= y1;    y1 ^= y0;
  583.         x1 ^= x0;    x0 ^= x1;    x1 ^= x0;
  584.     }
  585.     
  586.     EGB_color(work, 0, cl);
  587.     WORD(para +  0) = 2;
  588.     dmmy_x0 = x0 + lx;
  589.     for (;x0 <= dmmy_x0; x0++, x1++) {
  590.         WORD(para +  2) = x0;
  591.         WORD(para +  4) = y0;
  592.         WORD(para +  6) = x1;
  593.         WORD(para +  8) = y1;
  594.         EGB_connect(work, para);
  595.     }
  596.     return 1;
  597. }
  598.  
  599. #if !defined(__GNUC__)
  600.  
  601. int AOIpadCheck(int *status)    /* パッドの押されたボタン番号を返します。 */
  602. {
  603.     int old = 0;
  604.     
  605.     SND_joy_in_2(0, status);
  606.     old = *status;
  607.     if ((*status |   1) != old) return 0;
  608.     if ((*status |   2) != old) return 1;
  609.     if ((*status |   4) != old) return 2;
  610.     if ((*status |   8) != old) return 3;
  611.     if ((*status |  16) != old) return 4;
  612.     if ((*status |  32) != old) return 5;
  613.     if ((*status |  64) != old) return 6;
  614.     if ((*status | 128) != old) return 7;
  615.     return -1;
  616. }
  617.  
  618. int AOIpadCheck2(int *status, int a[])
  619. {
  620.     int old = 0;
  621.     int i;
  622.     
  623.     for (i = 0; i < 8; i++) a[i] = 0;    /* 配列初期化 */
  624.     SND_joy_in_2(0, status);
  625.     old = *status;
  626.     if ((*status |   1) != old) a[0] = 1;
  627.     if ((*status |   2) != old) a[1] = 1;
  628.     if ((*status |   4) != old) a[2] = 1;
  629.     if ((*status |   8) != old) a[3] = 1;
  630.     if ((*status |  16) != old) a[4] = 1;
  631.     if ((*status |  32) != old) a[5] = 1;
  632.     if ((*status |  64) != old) a[6] = 1;
  633.     if ((*status | 128) != old) a[7] = 1;
  634.     return TRUE;
  635. }
  636.  
  637. #endif
  638.  
  639. void ank2sjis(char string[], char str[])
  640. {
  641.     short    i = 0, j = 0;
  642.     char    sjiscode[257][3] = {
  643.         " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ",
  644.         " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ",
  645.         " ", "!", "”", "#", "$", "%", "&", "’", "(", ")", "*", "+", ",", "-", ".", "/",
  646.         "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?",
  647.         "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O",
  648.         "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "〔", "¥", "〕", "^", "_",
  649.         "’", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o",
  650.         "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", " ̄", " ",
  651.         " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ",
  652.         " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ",
  653.         " ", "。", "「", "」", "、", "・", "ヲ", "ァ", "ィ", "ゥ", "ェ", "ォ", "ャ", "ュ", "ョ", "ッ",
  654.         "ー", "ア", "イ", "ウ", "エ", "オ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス", "セ", "ソ",
  655.         "タ", "チ", "ツ", "テ", "ト", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "ヒ", "フ", "ヘ", "ホ", "マ",
  656.         "ミ", "ム", "メ", "モ", "ヤ", "ユ", "ヨ", "ラ", "リ", "ル", "レ", "ロ", "ワ", "ン", "゛", "゜",
  657.         " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ",
  658.         " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "
  659.         };
  660.         
  661.     while (str[i] != '\0') {
  662.         if ((0x81 <= str[i] && str[i] <= 0x9f) || (0xe0 <= str[i] && str[i] <= 0xef)) {    // 全角のとき
  663.             string[j++] = str[i++];
  664.             string[j++] = str[i++];
  665.         } else {    // 半角のとき
  666.             string[j++] = sjiscode[str[i]][0];
  667.             string[j++] = sjiscode[str[i]][1];
  668.             i++;
  669.         }
  670.     }
  671.     string[j] = '\0';
  672. }
  673.  
  674.  
  675. /* Oh!FMTOWNS 1992/3より抜粋 */
  676. unsigned int sjisToJis(unsigned int sjis)
  677. {
  678.     unsigned int    h, l;
  679.     
  680.     h = (sjis >> 8) & 0xff;
  681.     l = sjis & 0xff;
  682.     
  683.     if ( ((h > 0x9f) && (h < 0xe0)) || (h < 0x81) || (h > 0xef) || (l < 0x40) || (l > 0xfe) || (l == 0x7f) ) {
  684.         return 0x2129;
  685.     }
  686.     if (l > 0x7f) l--;
  687.     h -= (h <= 0x9f) ? 0x70 : 0xb0;
  688.     h <<= 1;
  689.     if (l >= 0x9e) l -= 0x5e + 0x1f;
  690.     else {
  691.         l -= 0x1f;
  692.         h--;
  693.     }
  694.     
  695.     return (h << 8) + l;
  696. }
  697.  
  698. long _AOIgetFontAddress(char st[], short fs)
  699. {                /* 文字列 st の先頭文字のフォントファイル上の番地を返す */
  700.     short    i = 0, k = 0;
  701.     long    j;
  702.     int    jisCode;
  703.     int    address;    /* 表示する文字のフォントファイル上の番地 */
  704.     long    firstAdr;    /* フォントファイル上で全角文字が始まる番地 */
  705.     long    stepAdr;    /* フォントファイル上の次のブロックまでのバイト数 */
  706.     long    fontS;        /* 1文字分のバイト数 */
  707.     jisCode = sjisToJis((st[0] << 8) + st[1]);    
  708.                 /* 文字列 st の先頭文字のJISコードを得る */
  709.     do {            /* 文字列 st を1文字分ずらす */
  710.         st[i]     = st[i + 2];
  711.         st[i + 1] = st[i + 3];
  712.         i += 2;
  713.     } while (st[i] != '\0');
  714.  
  715.     if (fs == 16 && jisCode >= 0x5020) return 3072;
  716.                 /* 12ドットの第2水準は空白置き換え */
  717.     switch (fs) {
  718.         case 64 :    /* 60ドットファイルの各種番地 */
  719.             firstAdr = 61440;
  720.             stepAdr  = 45120;
  721.             fontS = 480;
  722.             break;
  723.         case 48 :    /* 48ドットファイルの各種番地 */
  724.             firstAdr = 36880;
  725.             stepAdr  = 27072;
  726.             fontS = 288;
  727.             break;
  728.         case 32 :    /* 32ドットファイルの各種番地 */
  729.             firstAdr = 16400;
  730.             stepAdr  = 12032;
  731.             fontS = 128;
  732.             break;
  733.         case 24 :     /* 24ドットファイルの各種番地 */
  734.             firstAdr = 0x12;
  735.             stepAdr  = 0x1B2C;
  736.             fontS = 0x47 + 3;
  737.             break;
  738.         case 16 :    /* 12ドットファイルの各種番地 */
  739.             firstAdr = 3072;
  740.             stepAdr  = 2256;
  741.             fontS = 24;
  742.             break;
  743.     }
  744.                 /* フォントファイル上の番地を計算する */
  745.     for (j = 0x2120; j < 0x7427; j += 0x100) {
  746.         if (j <= jisCode && jisCode <= j + 0x5f) {
  747.             address = firstAdr  + fontS * (jisCode - j - 1) + stepAdr * k;
  748.             j = 0xFFFF;
  749.         }
  750.         k++;
  751.     }
  752.     
  753.     return address;
  754. }
  755.  
  756. void AOIstrFJ2(FILE *fp, short fs, short sx, short sy, char st[], short gap)
  757. {                        /* 全角の文字列を fp で示されるフォントで表示する */
  758.     short    lenSt;        /* 残りの文字数 */
  759.     short    fs2;        /* 8で割り切れない大きさのフォント用のダミー */
  760.     char    *data;        /* フォントデータ格納番地 */
  761.  
  762.     fs2 = fs;
  763.     if (fs == 60) {        /* 60ドットは64ドットとして処理 */
  764.         fs2 = fs = 64;
  765.         gap -= 4;
  766.     }
  767.     if (fs == 12) {        /* 12ドットは一部16ドットとして処理 */
  768.         fs = 16;
  769.         gap -= 4;
  770.     }
  771.     lenSt = (short)strlen(st) >> 1;
  772.                             /* lenSt に文字数を代入(全部全角文字と考え2で割っている) */
  773.     fseek(fp, _AOIgetFontAddress(st, fs), SEEK_SET);    /* 得られた番地までシークする */
  774.     data = (char *)malloc(fs2 * fs * sizeof(char));        /* フォントデータ格納領域確保 */
  775.     while (!feof(fp) && lenSt) {                        /* 残りの文字数が0になるまで */
  776.         fread(data, sizeof(char), (fs >> 3) * fs2, fp);    /* フォントデータを1文字分読み込む */
  777.         AOIanyChar(sx, sy, fs2, fs2, data);            /* 1文字描画 */
  778.         sx += (fs + gap);
  779.         lenSt--;        /*残りの文字数を1減らす */
  780.         fseek(fp, _AOIgetFontAddress(st, fs), SEEK_SET);/* 得られた番地までシークする */
  781.     }
  782.     free(data);                                            /* フォントデータ格納領域解放 */
  783. }
  784.  
  785. void AOIstring_FJ2(FILE *fp, short fs, short sx, short sy, char st[], short sc, short gap)
  786. {
  787.     EGB_color(work, 0, sc);
  788.     EGB_textZoom(work, 1, fs, fs);
  789.     AOIstrFJ2(fp, fs, sx, sy, st, gap);
  790. }
  791.  
  792. void AOIstrFJ2Zoom(FILE *fp, short fs, short sx, short sy, char st[], short sc, short gap, short zx, short zy)
  793. {
  794.     EGB_color(work, 0, sc);
  795.     EGB_textZoom(work, 1, zx, zy);
  796.     AOIstrFJ2(fp, fs, sx, sy, st, gap + (zx - fs));
  797. }
  798.  
  799. /*
  800. short _AOIstrFJ2setup_FontSearch(char fj2File[])    // HD と CDROMにあるFJ2フォントを捜索します。(-_-;)
  801. {
  802.     char    fj2Drv[][3] = {"d:", "e:", "f:", "g:", "h:", "i:", "j:", "k:", "l:", "m:", "n:", "o:", "p:", "q:"};
  803.     char    fj2FileName[50];
  804.     short    drvNum, endMark, retFntFileChk;
  805.     
  806.     strcpy(fj2FileName, fj2File);
  807.     fj2File[0] = '\0';
  808.     endMark = 0;
  809.     drvNum = 0;
  810.     do {
  811.         strcpy(fj2File, fj2Drv[drvNum]);
  812.         strcat(fj2File, fj2FileName);
  813.         retFntFileChk = _access(fj2File, 1);
  814. //        printf("%s\n", fj2File);
  815. //        printf("%d\n", retFntFileChk);
  816.         drvNum++;
  817.         if (drvNum == 15) endMark = 1;
  818.     } while (retFntFileChk != 0 && endMark != 1);
  819.     
  820.     if (endMark == 1) {
  821.         return FALSE;
  822.     } else {
  823.         return TRUE;
  824.     }
  825. }
  826.  
  827. enum {MINN, GOTH, MARU, KYOU, MOUH};
  828.  
  829. int _AOIstrFJ2setup_FontNameMake(char fj2File[], short fontSize)
  830. {
  831.     if (_AOIstrFJ2setup_FontSearch(fj2File) == FALSE) {    // fj2フォントの居所が不明のときは、FALSEを返す
  832.         return FALSE;
  833.     }
  834.  
  835. }
  836.  
  837. int AOIstrFJ2setup(FILE *fp, short fontName, short fontSizeX, short fontSizeY, short fontStyle, short color)
  838. {
  839.     char    fj2File[50];
  840.     char    string[256];
  841.     FILE    *fp1;
  842.     
  843.     if (_AOIstrFJ2setup_FontNameMake(fj2File, maxof(fontSizeX, fontSizeY)) == FALSE) {
  844.         // fj2フォントの居所が不明のときは、FALSEを返す
  845.         return FALSE;
  846.     }
  847.  
  848.     EGB_textZoom(work, 1, fontSizeX, fontSizeY)
  849.     EGB_textZoom(work, 0, fontSizeX, fontSizeY)
  850.     EGB_fontStyle(work, fontStyle)
  851.     EGB_color(work, 0, color);
  852.     
  853.  
  854. }
  855.  
  856. void AOIstrFJ2(FILE *fp, short fs, short sx, short sy, char st[], short gap)
  857. {                        // 全角の文字列を fp で示されるフォントで表示する
  858.     short    lenSt;        // 残りの文字数
  859.     short    fs2;        // 8で割り切れない大きさのフォント用のダミー
  860.     char    *data;        // フォントデータ格納番地
  861.  
  862.     fs2 = fs;
  863.     if (fs == 60) {        // 60ドットは64ドットとして処理
  864.         fs2 = fs = 64;
  865.         gap -= 4;
  866.     }
  867.     if (fs == 12) {        // 12ドットは一部16ドットとして処理
  868.         fs = 16;
  869.         gap -= 4;
  870.     }
  871.     lenSt = (short)strlen(st) >> 1;
  872.                             // lenSt に文字数を代入(全部全角文字と考え2で割っている)
  873.     fseek(fp, _AOIgetFontAddress(st, fs), SEEK_SET);    // 得られた番地までシークする
  874.     data = (char *)malloc(fs2 * fs * sizeof(char));        // フォントデータ格納領域確保
  875.     while (!feof(fp) && lenSt) {                        // 残りの文字数が0になるまで
  876.         fread(data, sizeof(char), (fs >> 3) * fs2, fp);    // フォントデータを1文字分読み込む
  877.         AOIanyChar(sx, sy, fs2, fs2, data);            // 1文字描画
  878.         sx += (fs + gap);
  879.         lenSt--;        //残りの文字数を1減らす
  880.         fseek(fp, _AOIgetFontAddress(st, fs), SEEK_SET);// 得られた番地までシークする
  881.     }
  882.     free(data);                                            // フォントデータ格納領域解放
  883. }
  884. */
  885.  
  886.  
  887. short _AOIsystem12FontSetup(char fnt12File[])
  888. // ハードディスクにある12ドットフォントを捜索します。(-_-;)
  889. {
  890.     char    fnt12Drv[][3] = {"d:", "e:", "f:", "g:", "h:", "i:", "j:", "k:", "l:", "m:", "n:", "o:", "p:"};
  891.     char    fnt12FileName[] = "\\sysinit\\system.fnt";
  892.     short    drvNum, endMark, retFntFileChk;
  893.     
  894.     endMark = 0;
  895.     drvNum = 0;
  896.     do {
  897.         strcpy(fnt12File, fnt12Drv[drvNum]);
  898.         strcat(fnt12File, fnt12FileName);
  899.         retFntFileChk = _access(fnt12File, 1);
  900. //        printf("%s\n", fnt12File);
  901. //        printf("%d\n", retFntFileChk);
  902.         drvNum++;
  903.         if (drvNum == 14) endMark = 1;
  904.     } while (retFntFileChk != 0 && endMark != 1);
  905.     
  906.     if (endMark == 1) {
  907.         return FALSE;
  908.     } else {
  909.         return TRUE;
  910.     }
  911. }
  912.  
  913. void AOIsystem16Font(short x, short y, short c, char *str)
  914. {
  915.     AOIstringData    AstringD;
  916.  
  917.     AstringD.sx = 12;
  918.     AstringD.sy = 12;
  919.     AstringD.ax =  6;
  920.     AstringD.ay = 12;
  921.     AstringD.sc = c;
  922.     AstringD.ss = 0x0;
  923.     AOIstring(x, y, &AstringD, str);
  924. }
  925.  
  926. void AOIsystem12Font(short x, short y, short c, char *str)
  927. {
  928.     char    fnt12File[50];
  929.     char    string[256];
  930.     FILE    *fp1;
  931.     
  932.     if (_AOIsystem12FontSetup(fnt12File) == FALSE) {    // 12ドットフォントの居所が不明のときは、16ドットで代用
  933.         AOIsystem16Font(x, y + 12, c, str);
  934.         return;
  935.     }
  936. //    printf("%s", fnt12File);
  937.     if ((fp1 = fopen(fnt12File, "rb")) == NULL) {
  938.         perror("system.fnt のオープンを失敗しました");
  939.     } else {
  940.         ank2sjis(string, str);
  941.         AOIstring_FJ2(fp1, 12, x, y + 12, string, c, 0);
  942.     }
  943.     
  944.     fclose(fp1);
  945.     return;
  946. }
  947.  
  948. int AOIgetGraph(char *buf, short x0, short y0, short x1, short y1)    /* 画像データ画面の読み込み */
  949. {
  950.     DWORD(para +  0) = (unsigned int)buf;
  951.     WORD (para +  4) = 0x14 /* getds() */;
  952.     WORD (para +  6) = x0;
  953.     WORD (para +  8) = y0;
  954.     WORD (para + 10) = x1;
  955.     WORD (para + 12) = y1;
  956.     return EGB_getBlock(work, para);            /* ドットデータの読み込み1 */
  957.  
  958. }
  959.  
  960. int AOIgetGraphZoom(char *buf, short x0, short y0, short x1, short y1, short xs, short ys)    /* 画像データ画面の読み込み */
  961. {
  962.     DWORD(para +  0) = (unsigned int)buf;
  963.     WORD (para +  4) = 0x14 /* getds() */;
  964.     WORD (para +  6) = x0;
  965.     WORD (para +  8) = y0;
  966.     WORD (para + 10) = x1;
  967.     WORD (para + 12) = y1;
  968.     WORD (para + 14) = xs;
  969.     WORD (para + 16) = ys;
  970.     return EGB_getBlock(work, para);            /* ドットデータの読み込み2 */
  971.  
  972. }
  973.  
  974. int AOIputGraph(char *buf, short x0, short y0, short x1, short y1)    /* 画像データ画面の書き込み */
  975. {
  976.     DWORD(para +  0) = (unsigned int)buf;
  977.     WORD (para +  4) = 0x14 /* getds() */;
  978.     WORD (para +  6) = x0;
  979.     WORD (para +  8) = y0;
  980.     WORD (para + 10) = x1;
  981.     WORD (para + 12) = y1;
  982.     return EGB_putBlock(work, 0, para);        /* ドットデータの書き込み1 */
  983. }
  984.  
  985. int AOIputGraphZoom(char *buf, short x0, short y0, short x1, short y1, short xs, short ys)
  986.     /* 画像データ画面の書き込み */
  987. {
  988.     DWORD(para +  0) = (unsigned int)buf;
  989.     WORD (para +  4) = 0x14 /* getds() */;
  990.     WORD (para +  6) = x0;
  991.     WORD (para +  8) = y0;
  992.     WORD (para + 10) = x1;
  993.     WORD (para + 12) = y1;
  994.     WORD (para + 14) = xs;
  995.     WORD (para + 16) = ys;
  996.     return EGB_putBlockZoom(work, 0, para);        /* ドットデータの書き込み2 */
  997. }
  998.  
  999. void AOIwindowMove(char *dispTmp, short *sx, short *sy, short lx, short ly)    /* ウインドゥ移動 */
  1000. {
  1001.     //    バグっています AOIwindowMove2を使用せよ
  1002.     int    ch, mx, my;
  1003.     int dx, dy;
  1004.     char dispTmp2[(640 / 8) * 480];                /* ドットデータの読み書き作業領域 */
  1005.  
  1006.     MOS_disp(0);
  1007.     AOIgetGraph(dispTmp2, *sx, *sy, *sx + lx + 7, *sy + ly + 7);
  1008.     AOIputGraph(dispTmp, *sx, *sy, *sx + lx + 7, *sy + ly + 7);
  1009.     MOS_typeRom(83 + 1, 8, 8, pat_work);    /* マウスを手の平に */
  1010.     MOS_disp(1);
  1011.     EGB_writeMode(work, 4);
  1012.     EGB_linePattern(work, 1, 0x55555555);
  1013.  
  1014.     MOS_rdpos(&ch, &mx, &my);
  1015.     dx = mx - *sx;
  1016.     dy = my - *sy;
  1017.  
  1018.     do {
  1019.         MOS_rdpos(&ch, &mx, &my);
  1020.         *sx = mx - dx;
  1021.         *sy = my - dy;
  1022.         MOS_disp(0);
  1023.         AOIbox(*sx, *sy, *sx + lx, *sy + ly, WHITE);
  1024.         AOIbox(*sx, *sy, *sx + lx, *sy + ly, WHITE);
  1025.         MOS_disp(1);
  1026.     } while (ch == 1);
  1027.     
  1028.     EGB_linePattern(work, 1, 0xffffffff);
  1029.     EGB_writeMode(work, 0);
  1030.     MOS_disp(0);
  1031.     MOS_typeRom(80 + 1, 0, 0, pat_work);    /* マウスを元通り */
  1032.     AOIgetGraph(dispTmp, *sx, *sy, *sx + lx + 7, *sy + ly + 7);
  1033.     AOIputGraph(dispTmp2, *sx, *sy, *sx + lx + 7, *sy + ly + 7);
  1034.     MOS_disp(1);
  1035. }
  1036.  
  1037. void AOIwindowMove2(char *winData, char *dispTmp, int *sx, int *sy, int lx, int ly, int sd)    /* ウインドゥ移動 */
  1038. {
  1039.     //    winData : ウィンドウのビットマップデータ
  1040.     //    dispTmp : ウィンドウ表示前の退避ビットマップデータ
  1041.     //    sx sy : ウィンドウ開始座標
  1042.     //    lx ly : ウィンドウ大きさ
  1043.     //    sd    : ウィンドウの影の大きさ
  1044.  
  1045.     int        ch, mx, my;
  1046.     int        dx, dy;
  1047.  
  1048.     MOS_disp(0);
  1049.     AOIputGraph(dispTmp, *sx, *sy, *sx + lx + sd, *sy + ly + sd);
  1050.     MOS_typeRom(83 + 1, 8, 8, pat_work);    /* マウスを手の平に */
  1051.     MOS_disp(1);
  1052.     EGB_writeMode(work, 4);
  1053.     EGB_linePattern(work, 1, 0x55555555);
  1054.  
  1055.     MOS_rdpos(&ch, &mx, &my);
  1056.     dx = mx - *sx;
  1057.     dy = my - *sy;
  1058.  
  1059.     do {
  1060.         MOS_rdpos(&ch, &mx, &my);
  1061.         *sx = mx - dx;
  1062.         *sy = my - dy;
  1063.         MOS_disp(0);
  1064.         AOIbox(*sx, *sy, *sx + lx, *sy + ly, WHITE);
  1065.         AOIbox(*sx, *sy, *sx + lx, *sy + ly, WHITE);
  1066.         MOS_disp(1);
  1067.     } while (ch == 1);
  1068.     
  1069.     EGB_linePattern(work, 1, 0xffffffff);
  1070.     EGB_writeMode(work, 0);
  1071.     MOS_disp(0);
  1072.     MOS_typeRom(80 + 1, 0, 0, pat_work);    /* マウスを元通り */
  1073.     AOIgetGraph(dispTmp, *sx, *sy, *sx + lx + sd, *sy + ly + sd);
  1074.     EGB_writeMode(work, 7);
  1075.     EGB_pastel(work, 128);
  1076.     AOIboxFull(*sx + sd, *sy + ly + 1, *sx + lx + sd, *sy + ly + sd, 0);
  1077.     AOIboxFull(*sx + lx + 1, *sy + sd, *sx + lx + sd, *sy + ly, 0);
  1078.     EGB_writeMode(work, 0);
  1079.     AOIputGraph(winData, *sx, *sy, *sx + lx, *sy + ly);
  1080.     MOS_disp(1);
  1081. }
  1082.  
  1083. int AOIgetColorMode(void)
  1084. {
  1085.     int        p0Reso, p1Reso, Reso;
  1086.  
  1087.     EGB_getResolution(&p0Reso, &p1Reso);
  1088.      if (EGB_getWritePage(0, 0) == 0) Reso = p0Reso;
  1089.      else Reso = p1Reso;
  1090.      switch (Reso) {
  1091.          case 1..4 : 
  1092.              Reso = R16;
  1093.              break;
  1094.          case 5..11 :
  1095.          case 15..18 :
  1096.              Reso = R32k;
  1097.              break;
  1098.          case 12..14 :
  1099.              Reso = R256;
  1100.              break;
  1101.      }
  1102.      
  1103.      return Reso;
  1104. }
  1105.  
  1106. int    AOImessageBox(int x, int y, int fontSize, char title[], int num, char mes[][AOImbMaxSize], int attr)
  1107. {
  1108.     /*    x : 中心X座標  y : 中心Y座標  */
  1109.     
  1110.     int        maxStrLen = 0, dmmyLen;
  1111.     int        winLenX, winLenY;
  1112.     int        winSx, winSy;    // ウィンドウ開始座標
  1113.     int        winSAx, winSAy;    // ウィンドウ作業エリア開始座標
  1114.     int        winGap = 5;
  1115.     int        winSd = 7;        // ウィンドウの影の大きさ
  1116.     int        btnSize;
  1117.     char    btnStr1[256];
  1118.     char    btnStr2[256];
  1119.     int        retID, retID_1, retID_2;
  1120.     int        ch, mx, my, button;
  1121.      int        endmark = 0;
  1122. //    int        buttonLamp = OFF;
  1123.     int        clmode;
  1124.     char     *dispTmp;                //  ドットデータの読み書き作業領域
  1125.     char     *winData;                //  ウィンドウ保存用
  1126.     AOIstringData    AstringD;
  1127.     AOIbuttonData    btnMB[BUTTON];
  1128.  
  1129.     MOS_disp(0);
  1130.  
  1131.     clmode = AOIgetColorMode();
  1132.  
  1133.     AstringD.sx = fontSize;
  1134.     AstringD.sy = fontSize;
  1135.     AstringD.ax = fontSize / 2;
  1136.     AstringD.ay = fontSize;
  1137.     AstringD.sc = 0;
  1138.     AstringD.ss = 0x00;
  1139.  
  1140.     btnSize = fontSize + 2;
  1141.     
  1142.     for (int i = 0; i < num; i++) {
  1143.         dmmyLen = strlen(mes[i]);
  1144.         if (dmmyLen > maxStrLen) maxStrLen = dmmyLen;
  1145.     }
  1146.     dmmyLen = strlen(title);
  1147.     if (dmmyLen > maxStrLen) maxStrLen = dmmyLen;
  1148.  
  1149.     winLenX = (maxStrLen + 6) * (fontSize / 2);
  1150.     winLenY = (num + 5) * fontSize;
  1151.     if (winLenX < 150) winLenX = 150;
  1152.     
  1153.     winSx = x - winLenX / 2;
  1154.     winSy = y - winLenY / 2;
  1155.     winSAx = winSx + winGap;
  1156.     winSAy = winSy + winGap;
  1157.  
  1158.     dispTmp = (char *)malloc((winLenX + winSd + 1) * (winLenY + winSd + 1) * 2);    /* データ格納領域確保 */
  1159.     AOIgetGraph(dispTmp, winSx, winSy, winSx + winLenX + winSd, winSy + winLenY + winSd);    //    画面退避
  1160.  
  1161.     if (clmode == R32k) {
  1162.         AOIwinBase32k(winSx, winSy, winLenX, winLenY, winSd);
  1163.     } else {
  1164.         AOIwinBase2(winSx, winSy, winLenX, winLenY, winSd);
  1165.     }
  1166.     
  1167.     //    クローズボタン
  1168.     if (clmode == R32k) {
  1169.         AOIbuttonBase32k(winSAx, winSAy, btnSize, btnSize);
  1170.     } else {
  1171.         AOIbuttonBase2(winSAx, winSAy, btnSize, btnSize);
  1172.     }
  1173.     if (clmode == R32k) {
  1174.         AstringD.sc = 0x7fff;
  1175.     } else {
  1176.         AstringD.sc = 0xf;
  1177.     }
  1178.     AOIstring(winSAx + 2, winSAy + fontSize, &AstringD, "造");
  1179.     AOIsetButton(&btnMB[1], winGap, winGap, btnSize, btnSize);
  1180.     AstringD.sc = 0;
  1181.  
  1182.     //    タイトルボタン
  1183.     if (clmode == R32k) {
  1184.         AOIbuttonBase32k(winSAx + btnSize + 1, winSAy, winLenX - (winGap * 2 + btnSize + 1), btnSize);
  1185.     } else {
  1186.         AOIbuttonBase2(winSAx + btnSize + 1, winSAy, winLenX - (winGap * 2 + btnSize + 1), btnSize);
  1187.     }
  1188.     AOIstring(winSAx + fontSize * 2, winSAy + fontSize + 1, &AstringD, title);
  1189.     AOIsetButton(&btnMB[2], winGap + btnSize + 1, winGap, winLenX - (winGap * 2 + btnSize + 1), btnSize);
  1190.     
  1191.     for (i = 0; i < num; i++) {
  1192.         AOIstring(winSAx + fontSize, winSAy + fontSize * 5 / 2 + i * fontSize * 5 / 4, &AstringD, mes[i]);
  1193.     }
  1194.     
  1195.     switch (attr) {        //    第一ボタンの文字列設定
  1196.         case MB_OK:
  1197.         case MB_OKCANCEL:
  1198.             strcpy(btnStr1, " OK");
  1199.             retID_1 = ID_OK;
  1200.             break;
  1201.         case MB_YESNO:
  1202.             strcpy(btnStr1, " Yes");
  1203.             retID_1 = ID_YES;
  1204.             break;
  1205.         default:
  1206.             strcpy(btnStr1, "エラー");
  1207.             retID_1 = ID_ERR;
  1208.             break;
  1209.     }
  1210.     switch (attr) {        //    第二ボタンの文字列設定
  1211.         case MB_OKCANCEL:
  1212.             strcpy(btnStr2, "Cancel");
  1213.             retID_2 = ID_CANCEL;
  1214.             break;
  1215.         case MB_YESNO:
  1216.             strcpy(btnStr2, " No");
  1217.             retID_2 = ID_NO;
  1218.             break;
  1219.         default:
  1220.             strcpy(btnStr2, "エラー");
  1221.             retID_2 = ID_ERR;
  1222.             break;
  1223.     }
  1224.  
  1225.     //    第一ボタン
  1226.     if (clmode == R32k) {
  1227.         AOIbuttonBase32k(winSAx + winLenX / 2 - fontSize * 4, winSy + winLenY - fontSize * 2, fontSize * 3, btnSize);
  1228.     } else {
  1229.         AOIbuttonBase2(winSAx + winLenX / 2 - fontSize * 4, winSy + winLenY - fontSize * 2, fontSize * 3, btnSize);
  1230.     }
  1231.     AOIstring(winSAx + winLenX / 2 - fontSize * 4, winSy + winLenY - fontSize + 1, &AstringD, btnStr1);
  1232.     AOIsetButton(&btnMB[3], winGap + winLenX / 2 - fontSize * 4, winLenY - fontSize * 2, fontSize * 3, btnSize);
  1233.     
  1234.     //    第二ボタン
  1235.     if (clmode == R32k) {
  1236.         AOIbuttonBase32k(winSAx + winLenX / 2 + fontSize / 2, winSy + winLenY - fontSize * 2, fontSize * 3, btnSize);
  1237.     } else {
  1238.         AOIbuttonBase2(winSAx + winLenX / 2 + fontSize / 2, winSy + winLenY - fontSize * 2, fontSize * 3, btnSize);
  1239.     }
  1240.     AOIstring(winSAx + winLenX / 2 + fontSize / 2, winSy + winLenY - fontSize + 1, &AstringD, btnStr2);
  1241.     AOIsetButton(&btnMB[4], winGap + winLenX / 2 + fontSize / 2, winLenY - fontSize * 2, fontSize * 3, btnSize);
  1242.     
  1243.     winData = (char *)malloc((winLenX + 1) * (winLenY + 1) * 2);    /* データ格納領域確保 */
  1244.     AOIgetGraph(winData, winSx, winSy, winSx + winLenX, winSy + winLenY);    //    描き上がったウィンドウを保存
  1245.  
  1246.     MOS_disp(1);
  1247.  
  1248.     do {
  1249.         MOS_rdpos(&ch, &mx, &my);
  1250.         button = 0;
  1251.         if (ch == 1) button = AOIbutton(winSx, winSy, mx, my, btnMB);    // マウスの入力
  1252. /*
  1253.         if (button > 0) {            // ボタン反転
  1254.             AOIbuttonLamp(winSx, winSy, &btnMB[button]);
  1255.             buttonLamp = ON;
  1256.             MOS_typeRom(115 + 1, 0, 0, pat_work);    // マウスも変更
  1257.             if (button == 1) {
  1258.                 MOS_typeRom(124 + 1, 0, 0, pat_work);
  1259.             }
  1260.         }
  1261. */
  1262.         switch (button) {
  1263.             case 1 :
  1264.                 endmark = 1;        // 終了条件設定
  1265.                 retID = ID_ERR;
  1266.                 break;
  1267.             case 2 :                // 移動
  1268.                 AOIwindowMove2(winData, dispTmp, &winSx, &winSy, winLenX, winLenY, winSd);
  1269.                 break;
  1270.             case 3 :
  1271.                 endmark = 1;        // 値を返す
  1272.                 retID = retID_1;
  1273.                 break;
  1274.             case 4 :
  1275.                 endmark = 1;        // 値を返す
  1276.                 retID = retID_2;
  1277.                 break;
  1278.         }
  1279. /*
  1280.         if (buttonLamp == ON) {                            // ボタンの反転
  1281.             if (button > 0) {
  1282.                 //AOIbuttonLamp(winSx, winSy, &btnMB[button]);
  1283.                 buttonLamp = OFF;
  1284.                 MOS_typeRom(80 + 1, 0, 0, pat_work);    // マウスも元通り
  1285.             }
  1286.         }
  1287. */
  1288.     } while (endmark != 1);
  1289.  
  1290.     MOS_disp(0);
  1291.     AOIputGraph(dispTmp, winSx, winSy, winSx + winLenX + winSd, winSy + winLenY + winSd);    //    退避画面復活
  1292.     MOS_disp(1);
  1293.  
  1294.     return retID;
  1295. }
  1296.  
  1297. int AOItiff(int sx, int sy, char filename[100])    /* 廃止    拡張ライブラリIの方を使用せよ */
  1298. {
  1299.     FILE    *fp;
  1300.     char    *data;
  1301.     short    x[1], y[1], bit[1];
  1302.     long    allBit;
  1303.     
  1304.     if ((fp = fopen(filename, "rb")) == NULL) {        /* ファイルオープン */
  1305.         perror("ファイルのオープンを失敗しました");
  1306.         return FALSE;
  1307.     }
  1308.     fseek(fp, 0x001e, SEEK_SET);    fread(x, sizeof(short), 1, fp);            /* ドット数読み込み */
  1309.     fseek(fp, 0x002a, SEEK_SET);    fread(y, sizeof(short), 1, fp);
  1310.     fseek(fp, 0x0036, SEEK_SET);    fread(bit, sizeof(short), 1, fp);        /* ビット数読み込み */
  1311. /* printf("%d %d %d", x[0], y[0], bit[0]); */
  1312.     switch (bit[0]) {
  1313.         case 4 :
  1314.             allBit = x[0] * y[0] / 2;    break;
  1315.         case 8 :
  1316.             allBit = x[0] * y[0];        break;
  1317.         case 16 :
  1318.             allBit = x[0] * y[0] * 2;    break;
  1319.     }
  1320.     data = (char *)malloc(allBit * sizeof(char));    /* データ格納領域確保 */
  1321.     fseek(fp, 0x0200, SEEK_SET);    fread(data, sizeof(char), allBit, fp);    /* 画像読み込み */
  1322.     free(data);                                        /* 動的に確保した領域の開放 */
  1323.     fclose(fp);
  1324.     DWORD(para +  0) = (unsigned int)data;
  1325.     WORD (para +  4) = 0x14;
  1326.     WORD (para +  6) = sx;
  1327.     WORD (para +  8) = sy;
  1328.     WORD (para + 10) = sx + x[0] - 1;
  1329.     WORD (para + 12) = sx + y[0] - 1;
  1330.     return EGB_putBlock(work, 0, para);    /* 画像描画 */
  1331. }
  1332.  
  1333. void AOIwide17(void)        /* WIDE display set */
  1334. /* 戸田 氏 の ゴットトランスファー の ソースリスト を参照 */
  1335. {
  1336.     int    i;
  1337.     int    para[10][2] = {
  1338.                 {  0,  80 },    /* HSW1 */
  1339.                 {  1, 590 },    /* HSW2 */
  1340.                 {  4, 669 },    /* HST  */
  1341.                 { 29,   3 },    /* CKI  */
  1342.                 {  9, 130 },    /* HDS0 */
  1343.                 { 11, 130 },    /*    1 */
  1344.                 { 18, 130 },    /* HAJ0 */
  1345.                 { 22, 130 },    /*    1 */
  1346.                 { 10, 642 },    /* HDE0 */
  1347.                 { 12, 642 }        /*    1 */
  1348.     };
  1349.  
  1350.     for(i = 0; i < 10; i++) {
  1351.         _outw(0x440, para[i][0]);
  1352.         _outw(0x442, para[i][1]);
  1353.     }
  1354. }
  1355.  
  1356. void AOIwide3(void)        /* WIDE display set */
  1357. {                        /* 左にズレるバグあり */
  1358.     int i;
  1359.     int para[14][2] = {
  1360.                 {  0, 110 },    /* HSW1 */
  1361.                 {  1, 802 },    /* HSW2 */
  1362.                 {  4, 909 },    /* HST  */
  1363.                 { 29,   0 },    /* CKI  */
  1364.                 { 18, 130 },    /* HAJ0 */
  1365.                 { 22, 130 },    /*    1 */
  1366.  
  1367.                 {  9, 138 },    /* HDS0  */
  1368.                 { 11, 138 },    /*    1 */
  1369.                 { 10, 898 },    /* HDE0     */
  1370.                 { 12, 898 },    /*    1 */
  1371.  
  1372.                 { 13, 53 },    /* VDS0  */
  1373.                 { 15, 53 },    /*    1 */
  1374.                 { 14, 1200/*106*/ },    /* VDE0     */
  1375.                 { 16, 1200/*106*/ }        /*    1 */
  1376.             };
  1377.  
  1378.     for(i = 0; i < 14; i++) {
  1379.         outpw(0x440, para[i][0]);
  1380.         outpw(0x442, para[i][1]);
  1381.     }
  1382. }
  1383.  
  1384. void AOIwide3_2(void)        /* WIDE display set */
  1385. {
  1386.     int i;
  1387.     int para[14][2] = {
  1388.                 {  0, 0x006e },    /* HSW1 */
  1389.                 {  1, 0x0322 },    /* HSW2 */
  1390.                 {  4, 0x038d },    /* HST  */
  1391.                 { 29, 0x0000 },    /* CKI  */
  1392.                 { 18, 0x008a },    /* HAJ0 */
  1393.                 { 22, 0x008a },    /*    1 */
  1394.  
  1395.                 {  9, 0x0082 },    /* HDS0  */
  1396.                 { 11, 0x0082 },    /*    1 */
  1397.                 { 10, 0x0382 },    /* HDE0     */
  1398.                 { 12, 0x0382 },    /*    1 */
  1399.  
  1400.                 { 13, 0x0035 },    /* VDS0  */
  1401.                 { 15, 0x0035 },    /*    1 */
  1402.                 { 14, 0x04b0 },    /* VDE0     */
  1403.                 { 16, 0x04b0 }        /*    1 */
  1404.             };
  1405.  
  1406.     for(i = 0; i < 14; i++) {
  1407.         outpw(0x440, para[i][0]);
  1408.         outpw(0x442, para[i][1]);
  1409.     }
  1410. }
  1411. void AOIwide3_3(void)        /* WIDE display set */
  1412. {
  1413.     int i;
  1414.     int para[16][2] = {
  1415.                 {  0, 0x006e },    /* HSW1 */
  1416.                 {  1, 0x0322 },    /* HSW2 */
  1417.                 {  4, 0x038d },    /* HST  */
  1418.                 {  9, 0x0082 },    /* HDS0 */
  1419.                 { 10, 0x0382 },    /* HDE0    */
  1420.                 { 11, 0x0082 },    /* HDS1 */
  1421.                 { 12, 0x0382 },    /* HDE1 */
  1422.                 { 13, 0x0035 },    /* VDS0 */
  1423.                 { 14, 0x04b0 },    /* VDE0    */
  1424.                 { 15, 0x0035 },    /* VDS1 */
  1425.                 { 16, 0x04b0 },    /* VDE1 */
  1426.                 { 18, 0x008a },    /* HAJ0 */
  1427.                 { 22, 0x008a },    /* HAJ1 */
  1428.                 { 29, 0x0000 },    /* CKI  */
  1429.             };
  1430.  
  1431.     for(i = 0; i < 14; i++) {
  1432.         outpw(0x440, para[i][0]);
  1433.         outpw(0x442, para[i][1]);
  1434.     }
  1435. }
  1436.  
  1437. short AOItownsName(void)    /* TOWNSの機種判別 */
  1438. {
  1439.     short m;
  1440.     
  1441.     switch (m = _inp(0x31)) {
  1442.         case 1..5 :
  1443.             break;
  1444.         default :
  1445.             m = 0;    break;
  1446.     }
  1447.     return m;    /* 1 : 初代   2 : 2代目   3 : 3代目   4 : IIUX   5 : IICX */
  1448. }
  1449.  
  1450.  
  1451.  
  1452. // サンプルプログラムは 13行目の // を取ってください
  1453.  
  1454. #ifdef    TEST
  1455.  
  1456. void main(void)
  1457. {
  1458.     AOIstringData    AstringD;    /* AOIstringData型の変数宣言 */
  1459.     int        i;
  1460.     FILE    *fp;
  1461.  
  1462.     EGB_init(work, EgbWorkSize);
  1463.     EGB_resolution(work, 0, 3);
  1464.     EGB_resolution(work, 1, 3);
  1465.     EGB_writePage(work, 0);
  1466.     
  1467.     AOIsetPalette( 1,  0,  9, 15);
  1468.     AOIsetPalette( 2,  0,  8,  0);
  1469.     AOIsetPalette( 3,  0,  8,  8);
  1470.     AOIsetPalette( 4,  8,  0,  0);
  1471.     AOIsetPalette( 5,  8,  0,  8);
  1472.     AOIsetPalette( 6, 12, 12, 12);
  1473.     AOIsetPalette( 7,  7,  7,  7);
  1474.     AOIsetPalette( 8,  2,  2,  2);
  1475.     AOIsetPalette( 9, 11, 12, 15);
  1476.     AOIsetPalette(10,  0, 15,  0);
  1477.     AOIsetPalette(11,  8, 15, 15);
  1478.     AOIsetPalette(12, 15,  0,  8);
  1479.     AOIsetPalette(13, 15,  0, 15);
  1480.     AOIsetPalette(14, 15, 15,  0);
  1481.     AOIsetPalette(15, 15, 15, 15);
  1482.  
  1483.     for (i = 0; i <= 450; i+= 30) AOIboxFull(0, i, 639, i + 30, i / 30);    
  1484.  
  1485.     AstringD.sx = 16;                    /* AOIstring使用例 */
  1486.     AstringD.sy = 16;
  1487.     AstringD.ax =  8;
  1488.     AstringD.ay = 16;
  1489.     AstringD.sc = 15;
  1490.     AstringD.ss = 0x02;
  1491.     AOIstring(100, 100, &AstringD, "あいうえおjkjkjk");
  1492.  
  1493.     AOIline(0, 0, 639, 399, 6);                    /* AOIline使用例 */
  1494.  
  1495.     AOIbox(100, 100, 200, 399, 7);                /* AOIbox使用例 */
  1496.  
  1497.     AOIboxFull(201, 100, 599, 200, 1);            /* AOIboxFull使用例 */
  1498.  
  1499.     if ((fp = fopen("Q:\\fj2\\font\\minn60.fnt", "rb")) == NULL) {
  1500.         perror("minn60.fnt のオープンを失敗しました");
  1501.     }
  1502.     AOIstring_FJ2(fp, 60, 300, 100, "文字列ABC", 14, 0);
  1503.     fclose(fp);
  1504.  
  1505.     AOIwinBase(250, 150, 350, 200, 1);            /* AOIwinBase使用例 */
  1506.  
  1507.     AOIbuttonBase(255, 155, 340, 16);        /* AOIbuttonBase使用例 */
  1508.  
  1509.     AstringD.sx = 12;                    /* AOIstring使用例 */
  1510.     AstringD.sy = 12;
  1511.     AstringD.ax =  6;
  1512.     AstringD.ay = 12;
  1513.     AstringD.sc = BLACK;
  1514.     AstringD.ss = 0x01;
  1515.     AOIstring(300, 168, &AstringD, "ウインドゥの試作版です");
  1516.  
  1517. }
  1518.  
  1519.  
  1520. #endif